const winston = require('winston');
const { combine, timestamp, printf, colorize } = winston.format;
const path = require('path');

// 确定日志文件路径
const logDir = 'logs'; // 日志文件将存储在项目根目录的 logs 文件夹下

// 自定义日志格式
const logFormat = printf(({ level, message, timestamp, stack }) => {
    // 如果存在堆栈信息（通常是错误日志），则打印堆栈
    return `${timestamp} [${level}]: ${stack || message}`;
});

// 创建 Logger 实例
const logger = winston.createLogger({
    // 默认日志级别，只有等于或高于此级别的日志才会被记录
    level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',

    // 日志格式
    format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat),

    // 传输器（Transports）定义日志发送到哪里
    transports: [
        // 1. 错误日志文件 (只记录 error 级别)
        new winston.transports.File({
            filename: path.join(logDir, 'error.log'),
            level: 'error',
            maxsize: 5242880, // 5MB
            maxFiles: 5, // 最多保留 5 个错误日志文件
        }),

        // 2. 组合日志文件 (记录所有级别: error, warn, info, debug 等)
        new winston.transports.File({
            filename: path.join(logDir, 'combined.log'),
            maxsize: 5242880, // 5MB
            maxFiles: 10, // 最多保留 10 个综合日志文件
        }),
    ],
    // 允许在没有 transports 定义时忽略错误
    exitOnError: false,
});

// 在非生产环境下，将日志输出到控制台并带上颜色
if (process.env.NODE_ENV !== 'production') {
    logger.add(
        new winston.transports.Console({
            format: combine(
                colorize(), // 启用颜色
                timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
                logFormat
            ),
        })
    );
}

// -----------------------------------------------------------
// 新增: 为 Morgan 提供 Stream 接口
// -----------------------------------------------------------
logger.stream = {
    // Morgan 接收到的日志行会通过此函数传递给 Winston
    write: function (message, encoding) {
        // 使用 'info' 级别记录 HTTP 请求日志
        // message 是由 morgan 格式化后的字符串，末尾包含换行符，需要去除
        logger.info(message.trim());
    },
};

module.exports = logger;
